package cn.lhf.cd;

import cn.lhf.cd.annotation.FXController;
import cn.lhf.cd.controller.MainController;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.fxml.JavaFXBuilderFactory;
import javafx.scene.Scene;
import javafx.stage.Stage;

/**
 * javafx的入口类，与程序入口分开的原故：
 * 在idea上启动报错：缺少 JavaFX 运行时组件, 需要使用该组件来运行此应用程序
 */
public class FXApplication extends Application {
    private static Stage primaryStage;

    /**
     * 获取Stage实例
     *
     * @return stage
     */
    public static Stage getPrimaryStage() {
        return primaryStage;
    }

    /**
     * 显示视图、切换页面
     *
     * @param clz 视图类
     * @throws Exception 神奇的异常
     */
    public static void showView(Class<?> clz) throws Exception {
        primaryStage.setScene(new Scene(loadFXML(clz).load()));
        primaryStage.show();
    }

    /**
     * 加载Controller对应的fxml
     * @param clz 神奇的class对象
     * @return fxml加载器实例
     * @throws Exception 神奇的异常
     */
    public static FXMLLoader loadFXML(Class<?> clz) throws Exception {
        FXController annotation = clz.getAnnotation(FXController.class);
        if (annotation == null) {   //传过来的class没有FXController注解
            throw new Exception(clz.getName() + "不是Controller");
        }
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(clz.getResource(annotation.path())); //设置fxml文件URL
        loader.setBuilderFactory(new JavaFXBuilderFactory());   //设置构建工厂
        return loader;
    }

    /**
     * 关闭窗口
     */
    public static void close() {
        primaryStage.close();
    }

    /**
     * 初始化fx程序
     *
     * @param primaryStage primaryStage
     * @throws Exception 神奇的异常
     */
    @Override
    public void start(Stage primaryStage) throws Exception {
        FXApplication.primaryStage = primaryStage;    //保存stage对象
        showView(MainController.class); //显示第一个页面
    }
}
